home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Archive / Graphics / QuickDraw GX / Imageer / source / offscrnGraphics.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-28  |  8.9 KB  |  2 lines  |  [TEXT/MPS ]

  1. /****************************************************//*                                                    *//*    File:        offscrnGraphics.c                    *//*                                                    *//*    Program:    Imageer                                *//*                                                    *//*    By:            Jason Hodges-Harris                    *//*                                                    *//*    Created:    26/10/95  00:00:00 AM                *//*                                                    *//*    Version:    1.0.0d3                                *//*                                                    *//*    Copyright:    © 1995-96 Apple Computer, Inc.,        */ /*                    all rights reserved.            */        /*                                                    *//****************************************************//**** Macintosh Toolbox Headers *****/#ifndef __PALETTES__#include <Palettes.h>#endif#ifndef __QDOFFSCREEN__#include <QDOffscreen.h>#endif#ifndef __TYPES__#include <Types.h>#endif/****   Application headers and prototypes   ****/#ifndef __IMAGEERAPPHEADER__#include "Imageer.app.h"#endif#ifndef __IMAGEERPROTOSHEADER__#include "Imageer.protos.h"#endif/****    Default RGB Colors    ****/static const RGBColor     kRGBBlack = {0x0000, 0x0000, 0x0000};static const RGBColor    kRGBWhite = {0xFFFF, 0xFFFF, 0xFFFF};/**** Create GWorld attached to the image window document structure    ****/#pragma segment ImageWorldGWorldPtr    CreateOffscreen (CTabHandle theCTabHndl, short theXsize, short theYsize, short theBitDepth,GWorldFlags theFlags){    GWorldPtr    theGWorldPtr = nil;    QDErr        theError;    Rect        theRect;        SetRect(&theRect,0,0,theXsize,theYsize);    theError = NewGWorld (&theGWorldPtr,theBitDepth,&theRect,theCTabHndl,nil,theFlags);    if (theError)    {        DisplayAlert (rGenAlert,rQDMessages,iFailGWorldAlloc);        return nil;    }    return theGWorldPtr;}/**** Draw image palette colors    ****/#pragma segment ImageWorldOSErr        DrawImageColors(WindowPtr    theWindow){    ImageDocHndl    theColorsDocHndl = nil,                    theFrontDocHndl = nil;    PaletteHandle    windowPalette;    WindowPtr        frontWindow,                    theNextWindow;    RGBColor        oldForeColor,                    newForeColor;    Rect            colorRect;    short            countX,                    countY,                    colorIndex = 0,                    numberColors;    OSErr            error = noErr;    Boolean            isImageWindow = false;        GetForeColor (&oldForeColor);    frontWindow = FrontWindow();    while (!isImageWindow && frontWindow)    {        theFrontDocHndl = (ImageDocHndl)GetWRefCon(theWindow);        if (!(**theFrontDocHndl).isColorsWindow)        {            isImageWindow = true;        }        else        {            theNextWindow = &((WindowPeek)frontWindow)->nextWindow->port;            frontWindow = theNextWindow;        }    }    theColorsDocHndl = (ImageDocHndl)GetWRefCon(theWindow);    if (theColorsDocHndl)    {        switch ((**theColorsDocHndl).theImageDepth)        {            case    1:                DisplayAlert (rGenWarning,rErrMessages,iNotImplemented);            break;            case    2:            windowPalette = (**theColorsDocHndl).theColorsPalette;            numberColors = (**windowPalette).pmEntries;            for (countX = 0;countX<128;countX+=32)            {                GetEntryColor (windowPalette, colorIndex, &newForeColor);                SetRect(&colorRect,16+ countX,16,countX+20,52);                RGBForeColor(&newForeColor);                PaintRect(&colorRect);                colorIndex++;            }            RGBForeColor(&oldForeColor);            return error;            break;            case    4:                windowPalette = (**theColorsDocHndl).theColorsPalette;                numberColors = (**windowPalette).pmEntries;                for (countY = 0;countY<32;countY+=16)                {                    for (countX = 0;countX<128;countX+=32)                    {                        GetEntryColor (windowPalette, colorIndex, &newForeColor);                        SetRect(&colorRect,16+ countX,16+countY,countX+20,32+countY);                        RGBForeColor(&newForeColor);                        PaintRect(&colorRect);                        colorIndex++;                    }                }                RGBForeColor(&oldForeColor);                return error;            break;            case    8:                windowPalette = (**theColorsDocHndl).theColorsPalette;                numberColors = (**windowPalette).pmEntries;                for (countY = 0;countY<32;countY+=4)                {                    for (countX = 0;countX<128;countX+=4)                    {                        GetEntryColor (windowPalette, colorIndex, &newForeColor);                        SetRect(&colorRect,16+ countX,16+ countY,countX+20,countY+20);                        RGBForeColor(&newForeColor);                        PaintRect(&colorRect);                        colorIndex++;                    }                }                RGBForeColor(&oldForeColor);                return error;            break;            case    16:            case    32:                for (countY = 0;countY<4;countY++)                {                    for (countX = 0;countX<128;countX+=2)                    {                        SetRect(&colorRect,16+ countX,16+(countY*8),countX+18,24+(countY*8));                        switch (countY)                        {                            case 0:                                newForeColor.red = countX << 9;                                newForeColor.green = countX << 9;                                newForeColor.blue = countX << 9;                                RGBForeColor(&newForeColor);                                PaintRect(&colorRect);                            break;                            case 1:                                newForeColor.red = countX << 9;                                newForeColor.green = 0;                                newForeColor.blue = 0;                                RGBForeColor(&newForeColor);                                PaintRect(&colorRect);                            break;                            case 2:                                newForeColor.red = 0;                                newForeColor.green = countX << 9;                                newForeColor.blue = 0;                                RGBForeColor(&newForeColor);                                PaintRect(&colorRect);                            break;                            case 3:                                newForeColor.red = 0;                                newForeColor.green = 0;                                newForeColor.blue = countX << 9;                                RGBForeColor(&newForeColor);                                PaintRect(&colorRect);                            break;                        }                    }                }                RGBForeColor(&oldForeColor);                return error;            break;        }    }    return kDefaultAppError;}/****    Force the colortable to be reset    ****/#pragma segment ImageWorldvoid    ForceRestoreColors(void){    RestoreDeviceClut(nil);    PaintBehind(nil, GetGrayRgn());    DrawMenuBar();}/****    Transfer visible portion of GWorld to current window    ****/#pragma segment ImageWorldOSErr    TransferImageToWindow(ImageDocHndl theWindDocHndl, WindowPtr theWindow){    PixMapHandle    thePixMapHndl = nil;    CGrafPtr        oldPort;    GDHandle        oldGDev;    RGBColor        oldForeColor,                    oldBackColor;    Rect            sourceRect,
  2.                     destRect;    OSErr            error = noErr;        GetGWorld(&oldPort,&oldGDev);    SetGWorld((**theWindDocHndl).theImageWorld,nil);    GetForeColor(&oldForeColor);    GetBackColor(&oldBackColor);    RGBForeColor(&kRGBBlack);    RGBBackColor(&kRGBWhite);    thePixMapHndl = GetGWorldPixMap((**theWindDocHndl).theImageWorld);    if (PixMap32Bit(thePixMapHndl))                    // if 32bit mode needed == true        SaveSetMMUMode(true);    if (!LockPixels(thePixMapHndl))        error = kFailedLockPixels;    if (!error)    {        sourceRect = (**theWindDocHndl).theImageWorld->portRect;        destRect = theWindow->portRect;        destRect.right -= kScrollBarWidth;    // resize port rect to exclude controller area        destRect.bottom -= kScrollBarWidth;        if (!EqualRect(&destRect,&sourceRect))            sourceRect = *CalcVisibleImage(theWindDocHndl,&destRect);        SetGWorld(oldPort,oldGDev);        CopyBits((BitMap*)(*thePixMapHndl),                 (BitMap*)&((*theWindow).portBits),                 &sourceRect,&destRect,srcCopy,nil);    }    UnlockPixels(thePixMapHndl);        // unlock GWorld    SaveSetMMUMode(false);    return error;}/****    Calculate the visible area of window contents region ****/#pragma segment ImageWorldRect*    CalcVisibleImage(ImageDocHndl theWindDocHndl,const Rect *destRect){    Rect    displayRect;    short    theXvalue,            theYvalue;    theXvalue = GetControlValue((**theWindDocHndl).theHScrollBar);    theYvalue = GetControlValue((**theWindDocHndl).theVScrollBar);    SetRect(&displayRect,theXvalue,theYvalue,destRect->right+theXvalue,destRect->bottom+theYvalue);    return &displayRect;}/****    Set and Reset the address mode between 24 and 32 bits    ****/#pragma segment ImageWorldvoid    SaveSetMMUMode(Boolean isSaveMode){    static signed char        theAddrMode = true32b;    static Boolean            swapModeNeeded = false;        if (isSaveMode == true)    {        if(GetMMUMode() == false32b)                // get current addr mode        {            swapModeNeeded = true;                    // in 24 bit mode swap needed            SwapMMUMode (&theAddrMode);                // switch to 32 bit mode        }    }    else if (swapModeNeeded == true)        SwapMMUMode (&theAddrMode);}/****    Calc new index depth colors window palette    ****/#pragma segment ImageWorldOSErr    UpdateColorsWindPalette(ImageDocHndl theImageWindDocHndl, WindowPtr theImageWindow){    ImageDocHndl    theFrntWindHndl;    GrafPtr            oldPort;    WindowPtr        theWindow,                    theNextWindow;    OSErr            error = noErr;        GetPort(&oldPort);    theWindow = FrontWindow();    while (theWindow)    {        theFrntWindHndl = (ImageDocHndl)GetWRefCon(theWindow);        if ((*theFrntWindHndl)->isColorsWindow)        {            if ((*theImageWindDocHndl)->theImageDepth != (*theFrntWindHndl)->theImageDepth)                (*theFrntWindHndl)->theImageDepth = (*theImageWindDocHndl)->theImageDepth;            if ((*theFrntWindHndl)->theImageDepth <= 8 && !(*theImageWindDocHndl)->isUsingQDGX)            {                if ((*theFrntWindHndl)->theColorsPalette)                    DisposePalette((*theFrntWindHndl)->theColorsPalette);                (*theFrntWindHndl)->theColorsPalette =                     NewPalette(256,                               (*(*theImageWindDocHndl)->theImageWorld->portPixMap)->pmTable,                               pmTolerant+pmExplicit,0);                if ((*theFrntWindHndl)->theColorsPalette)                     NSetPalette(theWindow,(*theFrntWindHndl)->theColorsPalette,pmAllUpdates);                else                    error = kFailMakePalette;            }            SetPort(theWindow);            InvalRect(&theWindow->portRect);            SetPort(oldPort);            theWindow = nil;        }        if (theWindow)        {            theNextWindow = &((WindowPeek)theWindow)->nextWindow->port;            theWindow = theNextWindow;        }    }    return error;}